#pragma once
#pragma once
#include <cstdlib>
#include <iostream>
#include <memory>
#include <alibabacloud/core/AlibabaCloud.h>
#include <alibabacloud/core/CommonRequest.h>
#include <alibabacloud/core/CommonClient.h>
#include <alibabacloud/core/CommonResponse.h>
#include "logger.hpp"

class DMSClient
{
    public:
    using ptr = std::shared_ptr<DMSClient>;
    DMSClient(const std::string& access_key_id,
    const std::string& access_key_secret)
    {
        AlibabaCloud::InitializeSdk();
        AlibabaCloud::ClientConfiguration configuration("cn-hangzhou");
        // specify timeout when create client.
        configuration.setConnectTimeout(1500);
        configuration.setReadTimeout(4000);
        // Please ensure that the environment variables ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set.
        std::string AccessKeyID = "LTAI5t8osCGkFQALivzNnsG9";
        std::string AccessSecret = "QgL7YKkuhGOhNISPTL1EE7QvK8Cfrw";
        AlibabaCloud::Credentials credential(AccessKeyID, AccessSecret);
        /* use STS Token
        credential.setSessionToken( getenv("ALIBABA_CLOUD_SECURITY_TOKEN") );
        */
        _client = std::make_shared<AlibabaCloud::CommonClient>(credential, configuration);
    }

    ~DMSClient() {AlibabaCloud::ShutdownSdk();}

    bool send(const std::string &phone, const std::string &code)
    {
        AlibabaCloud::CommonRequest request(AlibabaCloud::CommonRequest::RequestPattern::RpcPattern);
        request.setHttpMethod(AlibabaCloud::HttpRequest::Method::Post);
        request.setDomain("dysmsapi.aliyuncs.com");
        request.setVersion("2017-05-25");
        request.setQueryParameter("Action", "SendSms");
        request.setQueryParameter("SignName", "ChatSystem12");
        request.setQueryParameter("TemplateCode", "SMS_474655198");
        request.setQueryParameter("PhoneNumbers", phone);
        std::string param_code = "{\"code\":\"" + code + "\"}";
        request.setQueryParameter("TemplateParam", param_code);
        auto response = _client->commonResponse(request);
        if (!response.isSuccess())
        {
            LOG_ERROR("短信验证码请求失败：{}", response.error().errorMessage());
            return false;
        }
        return true;
    }

private:
    std::shared_ptr<AlibabaCloud::CommonClient> _client;
};